// 这个方法的返回值就是我们要创建reducer
import { handleActions as createReducer } from 'redux-actions'
import {
	addProductToLocalCart,
	changeLocalProductNumber,
	deleteProductFromLocalCart,
	saveCarts,
} from '../actions/cart.actions'

const initialState = []

// 这个函数可以接受到两个参数一个是 state 一个是 action
// 将商品添加到本地的购物车数据中
// state 就是原有的本地数据
// action 就是添加的商品数据
const handleAddProductToLocalCart = (state, action) => {
	// 1.要添加的商品没有在购物车中 直接添加
	// 2.要添加的商品已经在购物车中，将商品的数量加一

	// 将原有的购物车数据拷贝一份
	const newState = JSON.parse(JSON.stringify(state))
	// id 相同说明存在商品 数量加一
	const product = newState.find((product) => product.id === action.payload.id)
	if (product) {
		// 商品已经存在于购物车中
		product.count = Number(product.count) + 1
	} else {
		//商品不存在购物车当中
		newState.push(action.payload)
	}
	// return 的数据直接替换 state
	return newState
}

// 直接返回数据替换 initialState 的数据
const handleSaveCarts = (state, action) => action.payload
// 将服务器返回的删除的数据,然后删除本地购物车的商品
const handleDeleteProductFromLocalCart = (state, action) => {
	// 复制一份 state 数据
	const newState = JSON.parse(JSON.stringify(state))
	newState.splice(action.payload, 1)
	// return 的数据直接替换state
	return newState
}

const handleChangeLocalProductNumber = (state, action) => {
	// 复制一份 state 数据
	const newState = JSON.parse(JSON.stringify(state))
	const product = newState.find((product) => product.id === action.payload.id)
	product.count = action.payload.count
	return newState
}
// 第一个参数是一个对象，第二个参数是一个参数值
export default createReducer(
	{
		// 接收到这个actions以后就调用后面的这个方法

		// 将商品添加到本地的购物车数据中
		[addProductToLocalCart]: handleAddProductToLocalCart,
		// 将服务器端返回的购物车列表数据同步到本地的购物车中
		[saveCarts]: handleSaveCarts,
		// 将服务器返回的删除的数据,然后删除本地购物车的商品
		[deleteProductFromLocalCart]: handleDeleteProductFromLocalCart,
		// 更新购物车商品的数量
		[changeLocalProductNumber]: handleChangeLocalProductNumber,
	},
	initialState
)
